
package org.sql.commands.mysql.clause;

// *************************************************************************/
// Charada Soft
// Area de Desarrollo de Sistemas de Información
// *************************************************************************/
// Proyecto : java connector sql 
// Archivo : Where.java
// Descripcion : Clase Where
// *************************************************************************/
// Version : 2.10.4
// Fecha de Creación: 30 de Junio de 2014
// Author : Daniel Andres Castillo Pedroza
// *************************************************************************/

import java.util.ArrayList;
import org.sql.commands.Clause;
import org.sql.commands.Filter;
import org.sql.commands.exception.DMLException;

public class Where implements Clause {
    
    // Atributos de la clase Where
    
    private ArrayList <Filter> filters;
    
    // Constructor de la clase Where
    
    public Where() {
      filters = new ArrayList <> ();
    }

    // Metodos de la clase Where
    
    /**
      * 
      * @param filters 
    */
    
    public void setFilters(ArrayList <Filter> filters) {
      this.filters = filters;
    }
    
    /**
      * 
      * @param filter 
    */
    
    public void addFilter(Filter filter) {
      filters.add(filter);
    }
    
    // Metodos estáticos de la clase Where
    
    /**
      * 
      * @param filter
      * @return 
    */
    
    public static Where creatorClause(Filter filter) {
      Where where = new Where(); where.addFilter(filter);
      
      return where; // Retornando Objeto WHERE
    }
    
    /**
      * 
      * @param filters
      * @return 
    */
    
    public static Where creatorClause(ArrayList <Filter> filters) {
      Where where = new Where(); where.setFilters(filters);
      
      return where; // Retornando Objeto WHERE
    }

    // Metodos sobreescritos de la clase Where
    
    @Override
    public String getClause() throws DMLException {
      if ((filters == null) || (filters.isEmpty())) {
        throw new DMLException(DMLException.FILTERS_UNDEFINED);
      } // No ha definido los Filtros de la Clausula
        
      String cadenaFilters = ""; // Declarando dato para Proceso
      
      for (int index = 0; index < filters.size(); index++) {
        // Selecciando Filtro de la Lista
        Filter filter = filters.get(index);
        
        if (index != 0) {
          cadenaFilters += " " + filter.getConnector();
          cadenaFilters += " " + filter.getFilter();
        } // No es el Primer filtro del Array
        
        else {
          cadenaFilters += filter.getFilter();  
        } // Es el Primer filtro del Array
      } // Recorriendo el Array de Filtros del Where
      
      return "WHERE(" + cadenaFilters + ")"; // Retornando Clausula WHERE
    }
}